package com.xydtech.common.core.domain;

import com.xydtech.common.utils.StringUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.util.HashMap;

/**
 * 操作消息提醒
 *
 * @author xydtech
 */
@ApiModel(value = "操作消息提醒")
public class AjaxResult extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;

    /** 状态码 */
    @ApiModelProperty(value = "状态码")
    public static final String CODE_TAG = "code";

    /** 返回内容 */
    @ApiModelProperty(value = "返回内容")
    public static final String MSG_TAG = "msg";

    /** 数据对象 */
    @ApiModelProperty(value = "数据对象")
    public static final String DATA_TAG = "data";

    /**
     * 状态类型
     */
    public enum Type {
        SUCCESS(0, "成功"),
        WARN(301, "警告"),
        ERROR(500, "错误"),

        SYS_PARAMETER_MISS(40001, "参数缺失错误"),
        SYS_HEADER_INVALID(40002, "消息头不正确，header需要携带token参数"),
        SYS_TOKEN_EXPIRE(40003, "token已过期"),
        SYS_PASSWORD_INVALID(40004, "用户密码错误!"),
        SYS_USER_AUTH_FAILD(40005, "用户信息验证失败"),
        SYS_USER_PASS_NOT_EMPTY(40006, "账号和密码不能为空!"),
        SYS_USER_NAME_PASS_INVALID(40007, "用户不存在/密码错误!"),
        SYS_USER_ACCOUNT_DEL(40008, "对不起，您的账号已被删除!"),
        SYS_USER_ACCOUNT_DISABLED(40009, "用户已封禁，请联系管理员!"),
        SYS_TOKEN_INVALID(40010, "无效的token信息！"),
        SYS_REFRESH_TOKEN_INVALID(40011, "无效的refresh_token信息！"),

        CUST_HAS_EXIST(40101, "客户已存在！"),
        CUST_PHONE_BE_OCCUPY(40102, "手机号被占用！"),
        /**客户信息已存在且客户归属于当前客户经理*/
        OWNED_CUST_HAS_EXIST(40103, "客户信息已存在且客户归属于当前客户经理！"),
        CUST_IDCARD_INVALID(40104, "身份证号不合法！"),
        CUST_FAMILY_ERROR(40105, "查询家庭成员信息出错！");

        private final Integer value;
        private final String msg;

        Type(Integer value, String msg) {
            this.value = value;
            this.msg = msg;
        }

        public int value() {
            return this.value;
        }

        public String msg() {
            return this.msg;
        }
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
     */
    public AjaxResult() {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg 返回内容
     */
    public AjaxResult(Type type, String msg) {
        super.put(CODE_TAG, type.value);
        super.put(MSG_TAG, msg);
    }

    public AjaxResult(Type type) {
        super.put(CODE_TAG, type.value);
        super.put(MSG_TAG, type.msg);
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg 返回内容
     * @param data 数据对象
     */
    public AjaxResult(Type type, String msg, Object data) {
        super.put(CODE_TAG, type.value);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data)) {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * 方便链式调用
     *
     * @param key 键
     * @param value 值
     * @return 数据对象
     */
    @Override
    public AjaxResult put(String key, Object value) {
        super.put(key, value);
        return this;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static AjaxResult success() {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static AjaxResult success(Object data) {
        return AjaxResult.success("操作成功", data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg) {
        return AjaxResult.success(msg, null);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data) {
        return new AjaxResult(Type.SUCCESS, msg, data);
    }

    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult warn(String msg) {
        return AjaxResult.warn(msg, null);
    }

    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult warn(String msg, Object data) {
        return new AjaxResult(Type.WARN, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static AjaxResult error() {
        return AjaxResult.error("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(String msg) {
        return AjaxResult.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param type 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(Type type) {
        return new AjaxResult(type);
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult error(String msg, Object data) {
        return new AjaxResult(Type.ERROR, msg, data);
    }

    /**
     * 响应返回结果
     *
     * @param rows 影响行数
     * @return 操作结果
     */
    public static AjaxResult toAjax(int rows) {
        return rows > 0 ? success() : error();
    }
}
